﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Model.Models;
using Persistence;
namespace Services
{
    /// <summary>
    /// Gerencia todas as regras de negócio da entidade Subproduto
    /// </summary>
    public class GerenciadorSubproduto
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        public GerenciadorSubproduto()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        internal GerenciadorSubproduto(IUnitOfWork unitOfword)
        {
            this.unitOfWork = unitOfword;
            shared = true;
        }

        public int Inserir(Subproduto subprodutoModel)
        {
            TB_SUBPRODUTO subprodutoE = new TB_SUBPRODUTO();
            Atribuir(subprodutoModel, subprodutoE);
            unitOfWork.RepositorioSubproduto.Inserir(subprodutoE);
            unitOfWork.Commit(shared);
            return subprodutoE.id_SubProduto;

        }


        public void Editar(Subproduto subprodutoModel)
        {
            TB_SUBPRODUTO subprodutoE = new TB_SUBPRODUTO();
            Atribuir(subprodutoModel, subprodutoE);
            unitOfWork.RepositorioSubproduto.Editar(subprodutoE);
            unitOfWork.Commit(shared);
        }

        public void Remover(int idSubproduto)
        {
            unitOfWork.RepositorioSubproduto.Remover(subproduto => subproduto.id_SubProduto.Equals(idSubproduto));
            unitOfWork.Commit(shared);

        }

        private IQueryable<Subproduto> GetQuery()
        {
            IQueryable<TB_SUBPRODUTO> tb_subproduto = unitOfWork.RepositorioSubproduto.GetQueryable();
            var query = from subproduto in tb_subproduto
                        select new Subproduto
                        {
                            Id_Subproduto = subproduto.id_SubProduto,
                            Id_Empresa = subproduto.id_Empresa,
                            Descricao = subproduto.descricao,
                            Cod_subproduto = subproduto.cod_subProduto,
                            NomeEmpresa = subproduto.TB_EMPRESA.nome
                        };
            return query;
        }

        public IEnumerable<Subproduto> ObterTodos()
        {
            return GetQuery();
        }

        public Subproduto Obter(int idSubproduto)
        {
            IEnumerable<Subproduto> subprodutoEs = GetQuery().Where(subprodutoModel => subprodutoModel.Id_Subproduto.Equals(idSubproduto));
            return subprodutoEs.ElementAtOrDefault(0);
        }


        private void Atribuir(Subproduto subprodutoModel, TB_SUBPRODUTO subprodutoE)
        {
            subprodutoE.id_SubProduto = subprodutoModel.Id_Subproduto;
            subprodutoE.id_Empresa = subprodutoModel.Id_Empresa;
            subprodutoE.descricao = subprodutoModel.Descricao;
            subprodutoE.cod_subProduto = subprodutoModel.Cod_subproduto;
        }
    }
}